home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 2
/
AACD 2.iso
/
AACD
/
Magazine
/
GraphicsCards
/
StormMesa
/
src
/
hash.s
< prev
next >
Wrap
Text File
|
1999-02-04
|
6KB
|
360 lines
; Storm C Compiler
; Work2:Mesa3/Mesa-3.0/src/hash.c
mc68030
mc68881
XREF _printf
XREF _free
XREF _calloc
XREF _std__in
XREF _std__out
XREF _std__err
SECTION "_NewHashTable:0",CODE
;struct HashTable *NewHashTable(void)
XDEF _NewHashTable
_NewHashTable
L35
pea 1.w
pea $FA8.w
jsr _calloc
addq.w #$8,a7
rts
SECTION "_DeleteHashTable:0",CODE
rts
;void DeleteHashTable(struct HashTable *table)
XDEF _DeleteHashTable
_DeleteHashTable
movem.l d2/a2/a3,-(a7)
move.l $10(a7),a3
L36
; for (i=0;
moveq #0,d2
bra.b L41
L37
; struct HashEntry *entry = table->Table[i];
move.l 0(a3,d2.l*4),a0
; while (entry)
bra.b L39
L38
; struct HashEntry *next = entry->Next;
move.l $8(a0),a2
; free(entry);
move.l a0,-(a7)
jsr _free
addq.w #4,a7
; entry = next;
move.l a2,a0
L39
cmp.w #0,a0
bne.b L38
L40
addq.l #1,d2
L41
cmp.l #$3E9,d2
blo.b L37
L42
; free(table);
move.l a3,-(a7)
jsr _free
addq.w #4,a7
movem.l (a7)+,d2/a2/a3
rts
SECTION "_HashLookup:0",CODE
;void *HashLookup(const struct HashTable *table, GLuint key)
XDEF _HashLookup
_HashLookup
move.l d2,-(a7)
move.l $C(a7),d1
move.l $8(a7),a0
L43
; pos = key % TABLE_SIZE;
move.l d1,d0
divul.l #$3E9,d2:d0
; entry = table->Table[pos];
move.l d2,d0
move.l 0(a0,d0.l*4),a0
; while (entry)
bra.b L47
L44
; if (entry->Key == key)
move.l (a0),d0
cmp.l d1,d0
bne.b L46
L45
move.l 4(a0),d0
move.l (a7)+,d2
rts
L46
; entry = entry->Next;
move.l $8(a0),a0
L47
cmp.w #0,a0
bne.b L44
L48
moveq #0,d0
move.l (a7)+,d2
rts
SECTION "_HashInsert:0",CODE
;void HashInsert(struct HashTable *table, GLuint key, void *data)
XDEF _HashInsert
_HashInsert
movem.l d2/d3/a2/a3,-(a7)
movem.l $18(a7),d2/a2
move.l $14(a7),a3
L49
; if (key > table->MaxKey)
move.l a3,a0
cmp.l $FA4(a0),d2
bls.b L51
L50
; table->MaxKey = key;
move.l a3,a0
move.l d2,$FA4(a0)
L51
; pos = key % TABLE_SIZE;
move.l d2,d3
divul.l #$3E9,d0:d3
move.l d0,d3
; entry = table->Table[pos];
move.l 0(a3,d3.l*4),a0
; while (entry)
bra.b L55
L52
; if (entry->Key == key)
move.l (a0),d0
cmp.l d2,d0
bne.b L54
L53
; entry->Data = data;
move.l a2,4(a0)
movem.l (a7)+,d2/d3/a2/a3
rts
L54
; entry = entry->Next;
move.l $8(a0),a0
L55
cmp.w #0,a0
bne.b L52
L56
; entry = (struct HashEntry *) calloc(sizeof(struct HashEntry),
pea 1.w
pea $C.w
jsr _calloc
addq.w #$8,a7
move.l d0,a0
; entry->Key = key;
move.l d2,(a0)
; entry->Data = data;
move.l a2,4(a0)
; entry->Next = table->Table[pos];
move.l 0(a3,d3.l*4),$8(a0)
; table->Table[pos] = entry;
move.l a0,0(a3,d3.l*4)
movem.l (a7)+,d2/d3/a2/a3
rts
SECTION "_HashRemove:0",CODE
;void HashRemove(struct HashTable *table, GLuint key)
XDEF _HashRemove
_HashRemove
movem.l d2/a2/a3,-(a7)
move.l $14(a7),d2
move.l $10(a7),a3
L57
; pos = key % TABLE_SIZE;
move.l d2,d1
divul.l #$3E9,d0:d1
move.l d0,d1
; prev = NULL;
sub.l a1,a1
; entry = table->Table[pos];
move.l 0(a3,d1.l*4),a0
; while (entry)
bra.b L64
L58
; if (entry->Key == key)
move.l (a0),d0
cmp.l d2,d0
bne.b L63
L59
; if (prev)
cmp.w #0,a1
beq.b L61
L60
; prev->Next = entry->Next;
move.l $8(a0),$8(a1)
bra.b L62
L61
; table->Table[pos] = entry->Next;
move.l $8(a0),0(a3,d1.l*4)
L62
; free(entry);
move.l a0,-(a7)
jsr _free
addq.w #4,a7
movem.l (a7)+,d2/a2/a3
rts
L63
; prev = entry;
move.l a0,a1
; entry = entry->Next;
move.l $8(a0),a0
L64
cmp.w #0,a0
bne.b L58
L65
movem.l (a7)+,d2/a2/a3
rts
SECTION "_HashFirstEntry:0",CODE
;GLuint HashFirstEntry(const struct HashTable *table)
XDEF _HashFirstEntry
_HashFirstEntry
move.l 4(a7),a1
L66
; for (pos=0;
moveq #0,d0
bra.b L70
L67
; if (table->Table[pos])
tst.l 0(a1,d0.l*4)
beq.b L69
L68
move.l 0(a1,d0.l*4),a0
move.l (a0),d0
rts
L69
addq.l #1,d0
L70
cmp.l #$3E9,d0
blo.b L67
L71
; return
moveq #0,d0
rts
SECTION "_HashPrint:0",CODE
;void HashPrint(const struct HashTable *table)
XDEF _HashPrint
_HashPrint
movem.l d2/a2/a3,-(a7)
move.l $10(a7),a3
L73
; for (i=0;
moveq #0,d2
bra.b L78
L74
; struct HashEntry *entry = table->Table[i];
move.l 0(a3,d2.l*4),a2
; while (entry)
bra.b L76
L75
; printf("%u %p\n", entry->Key, entry->Data);
move.l 4(a2),-(a7)
move.l (a2),-(a7)
move.l #L72,-(a7)
jsr _printf
add.w #$C,a7
; entry = entry->Next;
move.l $8(a2),a2
L76
cmp.w #0,a2
bne.b L75
L77
addq.l #1,d2
L78
cmp.l #$3E9,d2
blo.b L74
L79
movem.l (a7)+,d2/a2/a3
rts
L72
dc.b '%u %p',$A,0
SECTION "_HashFindFreeKeyBlock:0",CODE
;GLuint HashFindFreeKeyBlock(const struct HashTable *table, GLuint nu
XDEF _HashFindFreeKeyBlock
_HashFindFreeKeyBlock
movem.l d2-d6/a2,-(a7)
move.l $20(a7),d6
move.l $1C(a7),a2
L80
; GLuint maxKey = ~((GLuint) 0);
moveq #-1,d5
; if (maxKey - numKeys > table->MaxKey)
move.l d5,d1
sub.l d6,d1
cmp.l $FA4(a2),d1
bls.b L82
L81
move.l $FA4(a2),d0
addq.l #1,d0
movem.l (a7)+,d2-d6/a2
rts
L82
; GLuint freeCount = 0;
moveq #0,d3
; GLuint freeStart = 0;
moveq #0,d4
; for (key=0;
moveq #0,d2
bra.b L88
L83
; if (HashLookup(table, key))
move.l d2,-(a7)
move.l a2,-(a7)
jsr _HashLookup
addq.w #$8,a7
tst.l d0
beq.b L85
L84
; freeCount = 0;
moveq #0,d3
; freeStart = key+1;
move.l d2,d4
addq.l #1,d4
bra.b L87
L85
; freeCount++;
addq.l #1,d3
; if (freeCount == numKeys)
cmp.l d6,d3
bne.b L87
L86
move.l d4,d0
movem.l (a7)+,d2-d6/a2
rts
L87
addq.l #1,d2
L88
cmp.l d5,d2
bne.b L83
L89
; return
moveq #0,d0
movem.l (a7)+,d2-d6/a2
rts
END